/*
 * buildin_commands.h
 *
 *  Created on: Dec 14, 2010
 *      Author: cpy.prefers.you@gmail.com
 */

#ifndef BUILDIN_COMMANDS_H_
#define BUILDIN_COMMANDS_H_

#include "clogo.h"
#include "symbol_table.h"

#define HELP_MESSAGE_WIDTH      0x0f

#define IS_POSITIVE_INT(_str)   strpbrk(_str, "-.eE")
#define IS_DATUM(_symbol)       MatchType(_symbol, 6, TYPE_WORD, TYPE_NUMBER, TYPE_LIST, TYPE_ARRAY, TYPE_BOOLEAN_TRUE, TYPE_BOOLEAN_FALSE)

extern void _add(Symbol_T *Dest, Symbol_T *Source);
extern void _sub(Symbol_T *Dest, Symbol_T *Source);
extern void _mul(Symbol_T *Dest, Symbol_T *Source);
extern void _div(Symbol_T *Dest, Symbol_T *Source);
extern void _above(Symbol_T *Dest, Symbol_T *Source);
extern void _above_or_equal(Symbol_T *Dest, Symbol_T *Source);
extern void _below(Symbol_T *Dest, Symbol_T *Source);
extern void _below_or_equal(Symbol_T *Dest, Symbol_T *Source);
extern void _equal(Symbol_T *Dest, Symbol_T *Source);
extern void _not_equal(Symbol_T *Dest, Symbol_T *Source);

extern void _and(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _array(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _arraytolist(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _butfirst(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _butlast(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _first(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _if(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _ifelse(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _item(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _last(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _list(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _not(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _or(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _sentence(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _thing(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _run(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void _word(SymbolList_T **Token, Symbol_T *ReturnValue);
extern void UserDefinedProcedure(SymbolList_T **Token, Symbol_T *ProcedureName);

extern void _bye(SymbolList_T **Token);
extern void _for(SymbolList_T **Token);
extern void _help(SymbolList_T **Token);
extern void _make(SymbolList_T **Token);
extern void _print(SymbolList_T **Token);
extern void _repeat(SymbolList_T **Token);
extern void _setitem(SymbolList_T **Token);
extern void _show(SymbolList_T **Token);
extern void _to(SymbolList_T **Token);

#endif /* BUILDIN_COMMANDS_H_ */
